
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.pec.view;

import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.view.mbean.*;
import com.brain.core.manager.RecursosManager;
import com.brain.pec.dto.AnalisisPecDto;
import com.brain.pec.dto.MatrizDto;
import com.brain.pec.dto.ProcesoPecDto;
import com.brain.pec.manager.AnalisisPecManager;
import com.brain.pec.manager.MatrizManager;
import com.brain.pec.manager.ProcesoPecManager;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.primefaces.model.chart.BubbleChartModel;
import org.primefaces.model.chart.BubbleChartSeries;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Hvives
 */
@Controller("reportesCategoriaPecMBean")
@Scope("session")
public class ReportesCategoriaPecMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(ReportesCategoriaPecMBean.class);
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private MatrizManager matrizManager;
    @Resource
    private ProcesoPecManager procesoPecManager;
    
    @Resource
    private AnalisisPecManager analisisPecManager;
    
    private MatrizDto dto;
    private MatrizDto dtoFiltro;
    
    private ProcesoPecDto procesoPecDto;
    
    private List<MatrizDto> listaMatriz;
    private List<ProcesoPecDto> listaProcesos;
    private BubbleChartModel bubbleCategoriasModel = new BubbleChartModel();
    private BubbleChartModel bubbleCategoriasModel1 = new BubbleChartModel();
    private BubbleChartModel bubbleCategoriasModel2 = new BubbleChartModel();
    private BubbleChartModel bubbleCategoriasModel3 = new BubbleChartModel();
    private BubbleChartModel bubbleCategoriasModel4 = new BubbleChartModel();
    
    private String keyTitulo = "";
    private int anio = 0;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;

    private List<AnalisisPecDto> listaAnalisisPec;    
    
    public ReportesCategoriaPecMBean() {
        
    }
    
    public String iniciar() {       
        
        ProcesoPecMBean procesoPecMBean = (ProcesoPecMBean) WebServletContextListener.getApplicationContext().getBean("procesoPecMBean");
        procesoPecMBean.setDtoFiltro(new ProcesoPecDto());
        procesoPecMBean.setLista(null);
        
        
        AnalisisPecDto ap = new AnalisisPecDto();
        this.dtoFiltro = new MatrizDto();
        this.dtoFiltro.setAnalisisPecDto(ap);
        return matrizManager.getUrlReporte();
        
        
        
        
    }

    public String iniciar(AnalisisPecDto analisisPecDto,int ind) {        
        this.inicializarDatos(analisisPecDto,ind);
        return matrizManager.getUrlReporteGrafico();
    }
    
    public String buscar(int ind) {        
        this.inicializarDatos(this.dtoFiltro.getAnalisisPecDto(),ind);
        return null;
    }
    
    public String iniciarLista(AnalisisPecDto analisisPecDto,int ind) {        
        this.inicializarDatos(this.dtoFiltro.getAnalisisPecDto(),ind);
        return matrizManager.getUrlReporteGrafico();
    }

    protected void inicializarDatos(AnalisisPecDto analisisPecDto,int ind) {
        
        this.anio = UtilCore.Fecha.obtenerAnioActual();
        bubbleCategoriasModel = reporteMatrizCategorias(analisisPecDto,ind);
    }
    
    public void editar() {
        ProcesoPecMBean procesoPecMBean = (ProcesoPecMBean) WebServletContextListener.getApplicationContext().getBean("procesoPecMBean");
        procesoPecMBean.setDto(procesoPecDto);
        procesoPecMBean.editar(3);
    }
    
    public void detalle() {
        ProcesoPecDto p = new ProcesoPecDto();
        p.setCategoriaPecDto(this.dto.getCategoriaDto());
        p.setCuadranteDto(this.dto.getCuadranteDto());
        p.setCaracteristicaDto(new ParametroDto(ConstantesPec.Parametro.CAR_OPERATIVO));
        try {
            this.listaProcesos = procesoPecManager.obtener(p);
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }
        
    private BubbleChartModel reporteMatrizCategorias(AnalisisPecDto analisisPecDto, int ind){
        try {            
            MatrizDto m = new MatrizDto();
            m.setAnalisisPecDto(analisisPecDto);
            m.setTipo(ConstantesPec.Entidad.TIPO_REP_2);
            this.listaMatriz = matrizManager.obtener(m);
        } catch (DAOException ex) {
            logger.error(ex);
        }        
        long totalProcesos = 0;
        BigDecimal b = BigDecimal.ZERO;
        for (MatrizDto l : this.listaMatriz) {
            totalProcesos = totalProcesos + l.getCantidad();
            b = b.add(l.getTotalImpacto());
        }
        
        BubbleChartModel model = new BubbleChartModel();
        
        for (MatrizDto l : this.listaMatriz) {                   
            if (ind == 0) { // por procesos
                l.setRadius(l.getCantidad()*100/totalProcesos);
            }else if (ind == 1) { //por impacto presupuestal
                l.setRadius(l.getTotalImpacto().longValue()*100/b.longValue());
            }

            
            
            
            String descripcion;
            
           /* if (l.getCuadranteDto().getId().equals(Long.valueOf(781)))
              descripcion = "";
            else*/
                descripcion = l.getCuadranteDto().getDescripcionCorta()+" "+ l.getCategoriaDto().getId()+"("+l.getRadius()+"%)";
            
            int y = l.getDificultadAbastecimiento().intValue();
            int x = l.getImpactoPresupuestal().intValue();
            
            int raidus = Integer.parseInt(l.getRadius()+"");
            //solo los del cuadrante 4
            
            model.add(new BubbleChartSeries(descripcion,x ,y ,raidus));
            
            if (l.getCuadranteDto().getId().equals(Long.valueOf(781))) {
             bubbleCategoriasModel1.add(new BubbleChartSeries(descripcion,x ,y ,raidus));
            }else if (l.getCuadranteDto().getId().equals(Long.valueOf(782))) {
             bubbleCategoriasModel2.add(new BubbleChartSeries(descripcion,x ,y ,raidus));
            }else if (l.getCuadranteDto().getId().equals(Long.valueOf(783))) {
             bubbleCategoriasModel3.add(new BubbleChartSeries(descripcion,x ,y ,raidus));
            }else if (l.getCuadranteDto().getId().equals(Long.valueOf(784))) {
             bubbleCategoriasModel4.add(new BubbleChartSeries(descripcion,x ,y ,raidus));
            }
        }
       //cargarPuntosTransparentes(model);
        
        /*model.add(new BubbleChartSeries("Acura", 70, 183,55));
        model.add(new BubbleChartSeries("Alfa Romeo", 45, 92, 36));
        model.add(new BubbleChartSeries("AM General", 24, 104, 40));
        model.add(new BubbleChartSeries("Bugatti", 50, 123, 60));
        model.add(new BubbleChartSeries("BMW", 15, 89, 25));
        model.add(new BubbleChartSeries("Audi", 40, 180, 20));
        model.add(new BubbleChartSeries("Aston Martin", 70, 70, 48));
         */
        return model;
    }
    
    public void cargarPuntosTransparentes(BubbleChartModel model){
        for (int i = 0; i<=60; i= i+6) {
            model.add(new BubbleChartSeries("",i ,1 ,1));        
        }
        
        for (int i = 0; i<=2500; i++) {
            model.add(new BubbleChartSeries("",1 ,i*1000000 ,1));        
        }
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        ReportesCategoriaPecMBean.logger = logger;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public int getAnio() {
        return anio;
    }

    public void setAnio(int anio) {
        this.anio = anio;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public BubbleChartModel getBubbleCategoriasModel() {
        return bubbleCategoriasModel;
    }

    public void setBubbleCategoriasModel(BubbleChartModel bubbleCategoriasModel) {
        this.bubbleCategoriasModel = bubbleCategoriasModel;
    }

    public MatrizManager getMatrizManager() {
        return matrizManager;
    }

    public void setMatrizManager(MatrizManager matrizManager) {
        this.matrizManager = matrizManager;
    }

    public List<MatrizDto> getListaMatriz() {
        return listaMatriz;
    }

    public void setListaMatriz(List<MatrizDto> listaMatriz) {
        this.listaMatriz = listaMatriz;
    }

    public MatrizDto getDto() {
        return dto;
    }

    public void setDto(MatrizDto dto) {
        this.dto = dto;
    }

    

    public List<ProcesoPecDto> getListaProcesos() {
        return listaProcesos;
    }

    public void setListaProcesos(List<ProcesoPecDto> listaProcesos) {
        this.listaProcesos = listaProcesos;
    }
    
    public List<AnalisisPecDto> getListaAnalisisPec() throws DAOException {        
        AnalisisPecDto a = new AnalisisPecDto();
        return analisisPecManager.obtenerParaListaDesplegable(a);
    }

    public void setListaAnalisisPec(List<AnalisisPecDto> listaAnalisisPec) {
        this.listaAnalisisPec = listaAnalisisPec;
    }  

    public ProcesoPecManager getProcesoPecManager() {
        return procesoPecManager;
    }

    public void setProcesoPecManager(ProcesoPecManager procesoPecManager) {
        this.procesoPecManager = procesoPecManager;
    }

    public AnalisisPecManager getAnalisisPecManager() {
        return analisisPecManager;
    }

    public void setAnalisisPecManager(AnalisisPecManager analisisPecManager) {
        this.analisisPecManager = analisisPecManager;
    }

    public MatrizDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(MatrizDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public ProcesoPecDto getProcesoPecDto() {
        return procesoPecDto;
    }

    public void setProcesoPecDto(ProcesoPecDto procesoPecDto) {
        this.procesoPecDto = procesoPecDto;
    }

    public BubbleChartModel getBubbleCategoriasModel1() {
        return bubbleCategoriasModel1;
    }

    public void setBubbleCategoriasModel1(BubbleChartModel bubbleCategoriasModel1) {
        this.bubbleCategoriasModel1 = bubbleCategoriasModel1;
    }

    public BubbleChartModel getBubbleCategoriasModel2() {
        return bubbleCategoriasModel2;
    }

    public void setBubbleCategoriasModel2(BubbleChartModel bubbleCategoriasModel2) {
        this.bubbleCategoriasModel2 = bubbleCategoriasModel2;
    }

    public BubbleChartModel getBubbleCategoriasModel3() {
        return bubbleCategoriasModel3;
    }

    public void setBubbleCategoriasModel3(BubbleChartModel bubbleCategoriasModel3) {
        this.bubbleCategoriasModel3 = bubbleCategoriasModel3;
    }

    public BubbleChartModel getBubbleCategoriasModel4() {
        return bubbleCategoriasModel4;
    }

    public void setBubbleCategoriasModel4(BubbleChartModel bubbleCategoriasModel4) {
        this.bubbleCategoriasModel4 = bubbleCategoriasModel4;
    }
    
    public String getDatatipFormat(){
        return "<span style=\"display:none;\">%s</span><span>%s</span>";
     }
}
